package session;

import Interface.Entity;
import storage.EntityStorage;
import storage.StorageInterface;

/**
 * Developed for NTT - All is an Entity
 * Questa classe è L'interfaccia del sottosistema session per il mondo esterno
 * @author Alessandro Pollace
 * @version 0.1
 */
public class SessionInterface {

    private StorageInterface storage;

    /**
     * Costruttore della classe Storage Interface
     * @throws Exception Impossibile creare l'oggetto DBConnect
     */
    public SessionInterface() throws Exception {
        this.storage = new StorageInterface();
    }

    /**
     * Permette di aggiungere una nuova EntityStorage al database.
     *
     * @param e
     *            EntityStorage su cui lavorare
     * @throws Exception Impossibile portare a completamento l'inserimento
     */
    public void add(Entity e, String user) throws Exception {
        this.storage.add(e);
    }

    /**
     * Permette di caricare un'EntityStorage dal database.
     *
     * @param e
     *            EntityStorage su cui è avvalorata la chiave primaria
     * @return EntityStorage caricata
     * @throws Exception Entity da caricare non trovata
     */
    public Entity load(Entity e) throws Exception {
        return this.storage.load(e);
    }

    /**
     * Permette di aggiornare una entity modificata.
     *
     * @param e
     *            EntityStorage su cui lavorare
     * @throws Exception impossibile aggiornare, magari si è tentato di modificare un attributo di cui è richista l'unicità ma la modifica viola questo principio
     */
    public void update(Entity e) throws Exception {
        this.storage.update(e);
    }

    /**
     * Questo metodo permette di cancellare una entity dal database.
     *
     * @param e
     *            Entty su cui lavorare.
     * @throws Exception Impossibile cancellare, l'entiy selezionata per il cancellamento o non esiste oppura ha delle entity di tipo diversa ed essa collegate
     */
    public void del(Entity e, String user) throws Exception {
        this.storage.del(e);
    }

    /**
     * questo metodo permette di effettuare la ricerca sulla base di dati
     * @param e Enntity su cui lavorare, l'Entity deve avere caricati gli attributi secondo la specifica degli argomenti
     * @param Arguments Argomenti per la ricerca
     * @return Array di entity corrispondenti ai criteri di ricerca
     * @throws Exception Impossibile effettuare la ricerca
     */
    public Entity[] find(Entity e, String Arguments[]) throws Exception {
        return this.storage.find(e, Arguments);
    }

    /**
     * Questa classe permette di recuperare la caption di un attributo di
     * una EntityStorage
     * @param NameEntity Nome dell'entity
     * @param NameAttribute Nome dell'attributo dell'entity
     * @return Caption in default language of system
     */
    public String getCaption(String NameEntity, String NameAttribute) throws Exception {
        return this.storage.getCaption(NameEntity, NameAttribute);
    }

    /**
     * Questa classe permette di recuperare la descrizione di un attributo di
     * una EntityStorage
     * @param NameEntity Nome dell'entity
     * @param NameAttribute Nome dell'attributo dell'entity
     * @return Descrizione in default language of system
     */
    public String getDescription(String NameEntity, String NameAttribute) throws Exception {
        return this.storage.getDescription(NameEntity, NameAttribute);
    }

    /**
     * Questa classe permette di recuperare la descrizione di un attributo di
     * Sistema
     * @param NameAttribute Nome dell'attributo
     * @return Caption in default language of system
     */
    public String getSystemControlCaption(String NameAttribute) throws Exception {
        return this.storage.getSystemControlCaption(NameAttribute);
    }
}
